/**
 * 空气状态类，抽象类，不能实例化
 */
export abstract class AirState {
  /**
   * 状态参数单位的计算属性，抽象方法，子类必须实现
   */
  abstract get unit(): string
  /**
   * 状态参数的描述计算属性，抽象方法，子类必须实现
   */
  abstract get description(): string
  // 值，子类可以继承
  value: number
  // 构造函数，传入一个值
  constructor(value: number) {
    this.value = value
  }

  /** 是否是有效值 */
  abstract isVaild(): boolean
}

export class Temperature extends AirState {
  constructor(value: number) {
    super(value)
  }
  get unit() {
    return '°C'
  }
  get description() {
    return '温度'
  }

  isVaild(): boolean {
    return this.value >= -100 && this.value <= 100
  }

  static fahrenheit(t: number) {
    return (t * 9) / 5 + 32
  }

  static celsius(f: number) {
    return ((f - 32) * 5) / 9
  }

  static kelvin(t: number) {
    return t + 273.15
  }
}

/**
 * 干球温度
 */
export class DryBulbTemperature extends Temperature {
  constructor(value: number) {
    super(value)
  }

  get description() {
    return '干球温度'
  }
}
/**
 * 湿球温度
 */
export class WetBulbTemperature extends Temperature {
  constructor(value: number) {
    super(value)
  }

  get description() {
    return '湿球温度'
  }
}
/**
 * 露点温度
 */
export class DewPointTemperature extends Temperature {
  constructor(value: number) {
    super(value)
  }

  get description() {
    return '露点温度'
  }
}
/**
 * 相对湿度
 */
export class RelativeHumidity extends AirState {
  constructor(value: number) {
    super(value)
  }
  get unit() {
    return '%'
  }
  get description() {
    return '相对湿度'
  }
  isVaild() {
    return this.value >= 0 && this.value <= 100
  }
}
/**
 * 含湿量
 */
export class Moistrue extends AirState {
  constructor(value: number) {
    super(value)
  }
  get unit() {
    return 'Kg/kg'
  }
  get description() {
    return '含湿量'
  }
  isVaild() {
    return this.value > 0 && this.value <= 0.9
  }
}
/**
 * 焓值
 */
export class Enthalpy extends AirState {
  constructor(value: number) {
    super(value)
  }
  get unit() {
    return 'kJ/kg'
  }
  get description() {
    return '焓'
  }
  isVaild(): boolean {
    return this.value > 0
  }
}
